package com.kl.oss.ali;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

/**
 * 上传图片到阿里云
 */
@RestController
@RequestMapping(value = "/ali")
public class AliOssUploadController {

    /**
     * 使用代码上传图片到阿里云对象存储步骤说明：
     * 1、在阿里云开通OSS存储服务
     * 2、创建Bucket，Bucket就是存储对象的一个命名空间
     * 3、先尝试就在官方页面手动上传图片看是否成功
     * 4、在本地导入OSS Java SDK依赖
     * 5、复制粘贴阿里云提供的Java上传模板，模板主要需要三个参数，Bucket的名字，accessKeyId和accessKeySecret
     * 6、在页面创建RAM账号并创建一个用户，用户创建完成后即可得到accessKeyId和accessKeySecret
     * 7、在页面给用户授权，授权用户能管理OSS对象存储
     * 8、指定上传的图片路径即可上传成功，上传成功后会为图片生成一个公网可以访问的链接
     * 9、结束
     * <p>
     * 下面这种方式显得有些麻烦，而且是硬编码，不方便修改，既然这是阿里提供的一个服务，
     * 那么spring-cloud-alibaba肯定集成了该服务
     */
    @Test
    public void testUpload() throws FileNotFoundException {
        // Endpoint以杭州为例，其它Region请按实际情况填写。
        String endpoint = "oss-cn-beijing.aliyuncs.com";
        // 云账号AccessKey有所有API访问权限，建议遵循阿里云安全最佳实践，创建并使用RAM子账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建。
        String accessKeyId = "LTAI5tJasbdht4S3sfa1nYhj";
        String accessKeySecret = "q66LsVpMQsHPvdZzxVEp33s69cJxvd";

        // 创建OSSClient实例
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 上传文件流。
        InputStream inputStream = new FileInputStream("D:\\用户\\桌面\\图片\\icon.png");
        // 上传
        ossClient.putObject("mall-keyklliu", "icon.png", inputStream);

        // 关闭OSSClient
        ossClient.shutdown();
        System.out.println("上传成功");
    }


    @Autowired
    private OSS ossClient;


    /**
     * 错误使用：
     * 这里的ossClient一定获取不到，为什么？
     * 这里用的是Junit4的单元测试，ossClient是在spring容器中，
     * 必须得依靠spring提供的单元测试才能拿到容器中的bean
     */
    @Test
    public void test() throws FileNotFoundException {
        System.out.println(ossClient);
        FileInputStream inputStream = new FileInputStream("D:\\用户\\桌面\\图片\\icon.png");
        // 参数1位bucket  参数2位最终名字
        ossClient.putObject("mall-keyklliu", "icon2.png", inputStream);
        ossClient.shutdown();
    }

    @ResponseBody
    @GetMapping("/upload")
    public String uploadToAli() throws FileNotFoundException {
        System.out.println(ossClient);
        FileInputStream inputStream = new FileInputStream("D:\\用户\\桌面\\图片\\icon.png");
        // 参数1:bucket  参数2:文件最终存储的名字
        ossClient.putObject("mall-keyklliu", "icon3.png", inputStream);
        ossClient.shutdown();
        return "上传成功";
    }
}
